﻿using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using GalaSoft.MvvmLight.Command;
using System.Diagnostics;
using System.Windows.Controls;
using System.Collections.ObjectModel;
using SGT.Model;
using SGT.Views;
using System;
using System.Windows;


namespace SGT.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool's support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm/getstarted
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        const int CTE_RECENT = 10;
        private ObservableCollection<Grafica> _Charts;
        private ObservableCollection<bool> _TabVisibles;
        private ObservableCollection<Remito> _RemitosRecientes;
        private Uri _ContenidoPagina;
        private Grafica _GraficaSelecionada;
        private Grafica _GraficaDeposito;
        private Deposito _DepositoActual;
        private bool _TabRemitosVisible;
        private bool _TabInicioVisible;
        private bool _TabProveedoresVisible;
        private bool _TabDepositosVisible;
        private bool _TabMercaderiasVisible;
        private ObservableCollection<ASectorViewModel> _primeraGeneracion;
        private ASectorViewModel _raizArbolSectores;
        public RelayCommand NuevaSalidaCommand { get; private set; }
        public RelayCommand AgregarMercaderia { get; private set; }
        public RelayCommand AgregarProveedor { get; private set; }
        public RelayCommand NuevoDeposito { get; private set; }
        public RelayCommand EstablecerDepositoActual { get; private set; }
        public RelayCommand IrAEntradaRemitosDeposito { get; private set; }
        public RelayCommand IrAInicio { get; private set; }
        public RelayCommand IrANuevoRemitoEntrada { get; private set; }
        public RelayCommand IrAVerDepositos { get; private set; }
        public RelayCommand IrAVerProveedores { get; private set; } 

        Messenger mes = Messenger.Default;
        Window ventana;


        public ObservableCollection<Remito> RemitosRecientes
        {
            get { return _RemitosRecientes; }
            set
            {
                _RemitosRecientes = value;
                RaisePropertyChanged("RemitosRecientes");
            }
        }

        public ObservableCollection<Grafica> Charts
        {
            get { return _Charts; }
            set
            {
                _Charts = value;
                RaisePropertyChanged("Charts");
            }
        }

        public Uri ContenidoPagina
        {
            get { return _ContenidoPagina; }
            set
            {
                _ContenidoPagina = value;
                RaisePropertyChanged("ContenidoPagina");
            }
        }


        public bool TabRemitosVisible
        {
            get { return _TabRemitosVisible; }
            set
            {
                _TabRemitosVisible = value;
                RaisePropertyChanged("TabRemitosVisible");
            }
        }

        public bool TabInicioVisible
        {
            get { return _TabInicioVisible; }
            set
            {
                _TabInicioVisible = value;
                RaisePropertyChanged("TabInicioVisible");
            }
        }

        public bool TabProveedoresVisible
        {
            get { return _TabProveedoresVisible; }
            set
            {
                _TabProveedoresVisible = value;
                RaisePropertyChanged("TabProveedoresVisible");
            }
        }

        public bool TabDepositosVisible
        {
            get { return _TabDepositosVisible; }
            set
            {
                _TabDepositosVisible = value;
                RaisePropertyChanged("TabDepositosVisible");
            }
        }

        public bool TabMercaderiasVisible
        {
            get { return _TabMercaderiasVisible; }
            set
            {
                _TabMercaderiasVisible = value;
                RaisePropertyChanged("TabMercaderiasVisible");
            }
        }


        public Grafica GraficaSelcionada
        {
            get { return _GraficaSelecionada; }
            set
            {
                _GraficaSelecionada = value;
                RaisePropertyChanged("GraficaSelcionada");
                seleccionarSector();
            }
        }

        public Grafica GraficaDeposito
        {
            get { return _GraficaDeposito; }
            set
            {
                _GraficaDeposito = value;
                RaisePropertyChanged("GraficaDeposito");
                
            }
        }


        public Deposito DepositoActual
        {
            get { return _DepositoActual; }
            set
            {
                _DepositoActual = value;
                RaisePropertyChanged("DepositoActual");
                
            }
        }

        public ObservableCollection<ASectorViewModel> PrimeraGeneracion
        {
            get { return _primeraGeneracion; }
            set
            {
                _primeraGeneracion = value;
                RaisePropertyChanged("PrimeraGeneracion");

            }
        }



        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.
            }
            else
            {
                InicializarVisibilidades();
                DepositoActual = ManejadorDepositos.GetDepositoActual();
                _GraficaDeposito = ManejadorDepositos.GetGraficaDeposito();
                _Charts = ManejadorDepositos.GetGraficas();
                InicializarComandos();
                //Messenger.Default.Register<Deposito>(this, elDeposito => DepositoActual = elDeposito);
                Messenger.Default.Register<Deposito>(this, elDeposito => cambiarDepositoActual(elDeposito));
                ContenidoPagina = new Uri("/Views/RemitoGridView.xaml", UriKind.Relative);
                _RemitosRecientes = ManejadorRemitos.GetUltimosRemitos(CTE_RECENT);
                Messenger.Default.Register<Mensaje>(this, msg => procesarMensaje(msg));
                cargarArbol();
                
                
              
            
            }
        }

        private void InicializarComandos()
        {
            NuevaSalidaCommand = new RelayCommand(NuevaSalida);
            AgregarMercaderia = new RelayCommand(IngresarMercaderia);
            AgregarProveedor = new RelayCommand(IngresarProveedor);
            NuevoDeposito = new RelayCommand(nuevoDeposito);
            IrAEntradaRemitosDeposito = new RelayCommand(NavegarEntradaRemitoDeposito);
            IrAInicio = new RelayCommand(NavegarInicio);
            EstablecerDepositoActual = new RelayCommand(mostrarEstablecerDepositoActual);
            IrANuevoRemitoEntrada = new RelayCommand(NavegarNuevoRemitoEntrada);
            IrAVerDepositos = new RelayCommand(NavegarVerListaDepositos);
            IrAVerProveedores = new RelayCommand(NavegarVerListaProveedores);
            MostrarTodosLosTabs();            

        }

        private void cargarArbol()
        {
            //Creo el arbol de sectores
            _raizArbolSectores = new ASectorViewModel(ManejadorDepositos.GetArbolSectoresDepositoActual());

            PrimeraGeneracion = new ObservableCollection<ASectorViewModel>(
                new ASectorViewModel[] 
                { 
                    _raizArbolSectores 
                });
            //Fin arbol de sectores
        }

        private void NuevaSalida()
        {

        
            mes.Send(new GalaSoft.MvvmLight.Messaging.DialogMessage("Hey", res =>
            {
                Debug.WriteLine(res.ToString());
            }), "mb1");
        }

        private void IngresarMercaderia()
        {
            var nuevaMercaderia = new NuevaMercaderiaView();
            nuevaMercaderia.ShowDialog();
        }

        private void IngresarProveedor()
        {
            var nuevoProveedor = new NuevoProveedorView();
            nuevoProveedor.ShowDialog();
        }

        private void nuevoDeposito()
        {
            var nuevoDeposito = new NuevoDepositoView();
            nuevoDeposito.ShowDialog();
        }

        private void mostrarEstablecerDepositoActual()
        {
            var establecerDepositoVentana = new ABMDepositosView();
            establecerDepositoVentana.ShowDialog();
        }

        private void armarGraficas()
        {
            if (_Charts == null)
                _Charts = new ObservableCollection<Grafica>();
            else
                _Charts.Clear();
            foreach (Sector s in DepositoActual.ColeccionSectores)
            {
                Grafica g = new Grafica();
                g.Titulo = s.Nombre;
                g.ListaSectores = new ObservableCollection<Sector>();
                g.ListaSectores.Add(s);
                Charts.Add(g);
            }
            
        }

        private void cambiarDepositoActual(Deposito d)
        {
            DepositoActual = d;
            armarGraficas();
            cargarArbol();
        }

        private void seleccionarSector()
        {
            Sector s = GraficaSelcionada.ListaSectores[0];
            Messenger.Default.Send<Sector, RemitoViewModel>(s);

        }

        private void InicializarVisibilidades()
        {
            _TabVisibles = new ObservableCollection<bool>();
            _TabVisibles.Add(TabRemitosVisible);
            _TabVisibles.Add(TabProveedoresVisible);
            _TabVisibles.Add(TabMercaderiasVisible);
            _TabVisibles.Add(TabInicioVisible);
            _TabVisibles.Add(TabDepositosVisible);
            //Revisar esto ta mal
            TabInicioVisible = true;
        }

        private void NavegarEntradaRemitoDeposito()
        {
            CerrarVentana();
            ContenidoPagina = new Uri("/Views/RemitoGridView.xaml", UriKind.Relative);
            Mensaje txt = new Mensaje();
            txt.texto = "RecagarDeposito";
            Messenger.Default.Send<Mensaje, RemitoViewModel>(txt);
            OcultarTabs();
            TabRemitosVisible = true;
        }

        private void NavegarInicio()
        {
            ContenidoPagina = new Uri("/Views/PortadaView.xaml", UriKind.Relative);
            OcultarTabs();
            TabInicioVisible = true;
        }

        private void NavegarNuevoRemitoEntrada()
        {
            //ContenidoPagina = new Uri("/Views/RemitoEntradaDepositoView.xaml", UriKind.Relative);
            OcultarTabs();
            TabRemitosVisible = true;
            ventana = new RemitoEntradaDepositoView();
            ventana.ShowDialog();
            
        }

        private void NavegarVerListaDepositos()
        {
            ContenidoPagina = new Uri("/Views/DepositosGridView.xaml", UriKind.Relative);
            OcultarTabs();
            TabDepositosVisible = true;

        }

        private void NavegarVerListaProveedores()
        {
            ContenidoPagina = new Uri("/Views/ProveedoresGridView.xaml", UriKind.Relative);
            OcultarTabs();
            TabProveedoresVisible = true;

        }
        private void procesarMensaje(Mensaje msg)
        {
            if (msg.texto.CompareTo("RecargarGraficas") == 0)
                armarGraficas();
            if (msg.texto.CompareTo("GridRemito") == 0)
                GraficaSelcionada = ManejadorDepositos.GetGrafica(msg.par1);
                
        }

        private void OcultarTabs() //Temporal ver de mejorar
        {
            TabRemitosVisible = false;
            TabProveedoresVisible = false;
            TabMercaderiasVisible = false;
            TabInicioVisible = false;
            TabDepositosVisible = false;
            TabInicioVisible = false;

        }

        private void MostrarTodosLosTabs() //Temporal ver de mejorar
        {
            TabRemitosVisible = true;
            TabProveedoresVisible = true;
            TabMercaderiasVisible = true;
            TabInicioVisible = true;
            TabDepositosVisible = true;
            TabInicioVisible = true;

        }

        private void CerrarVentana()
        {
            if (ventana != null)
                ventana.Close();
        }

        ////public override void Cleanup()
        ////{
        ////    // Clean up if needed

        ////    base.Cleanup();
        ////}
    }
}